package com.luoshizhen.lease.web.admin.controller.system;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.luoshizhen.lease.common.result.Result;
import com.luoshizhen.lease.model.entity.SystemPost;
import com.luoshizhen.lease.model.enums.BaseStatus;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.luoshizhen.lease.web.admin.service.SystemPostService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RestController
@Tag(name = "后台用户岗位管理")
@RequestMapping("/admin/system/post")
public class SystemPostController {

    @Autowired
    private SystemPostService service;

    /**
     * 分页获取岗位信息
     *
     * @param current 当前页码，用于指定从哪一页开始获取数据
     * @param size    每页大小，用于指定每页包含的记录数
     * @return 返回包含岗位信息的分页对象
     */
    @Operation(summary = "分页获取岗位信息")
    @GetMapping("page")
    private Result<IPage<SystemPost>> page(@RequestParam long current, @RequestParam long size) {

        // 创建分页对象，传入当前页码和每页大小
        IPage<SystemPost> page = new Page<>(current, size);

        // 调用服务层方法，执行岗位信息的分页查询
        IPage<SystemPost> systemPostPage = service.page(page);

        // 返回查询结果，封装为Result对象表示成功
        return Result.ok(systemPostPage);
    }

    /**
     * 保存或更新岗位信息
     *
     * 此方法用于处理保存或更新系统岗位数据的请求它通过接收一个SystemPost对象，
     * 调用服务层的saveOrUpdate方法来执行保存或更新操作
     *
     * @param systemPost 岗位信息对象，包含要保存或更新的岗位数据
     * @return 返回操作结果，成功则返回Result.ok()
     */
    @Operation(summary = "保存或更新岗位信息")
    @PostMapping("saveOrUpdate")
    public Result saveOrUpdate(@RequestBody SystemPost systemPost) {

        service.saveOrUpdate(systemPost);
        return Result.ok();
    }

    /**
     * 根据ID删除岗位信息
     *
     * @param id 岗位的唯一标识符
     * @return 删除操作的结果，使用Result封装以提供更多的上下文信息
     */
    @DeleteMapping("deleteById")
    @Operation(summary = "根据id删除岗位")
    public Result removeById(@RequestParam Long id) {

        service.removeById(id);
        return Result.ok();
    }

    /**
     * 根据ID获取岗位信息
     *
     * @param id 岗位的唯一标识符
     * @return 返回岗位信息的结果对象
     */
    @GetMapping("getById")
    @Operation(summary = "根据id获取岗位信息")
    public Result<SystemPost> getById(@RequestParam Long id) {
        // 通过服务层方法获取岗位信息
        SystemPost systemPost = service.getById(id);
        // 返回成功的岗位信息结果
        return Result.ok(systemPost);
    }

    /**
     * 获取全部岗位列表
     *
     * 通过发送GET请求到/list来调用此方法，它将返回系统中的所有岗位信息列表
     * 此方法不需要任何参数
     *
     * @return 包含所有岗位信息的列表，封装在Result对象中
     */
    @Operation(summary = "获取全部岗位列表")
    @GetMapping("list")
    public Result<List<SystemPost>> list() {
        List<SystemPost> list = service.list();
        return Result.ok(list);
    }

    // 修改岗位状态的API接口
    @Operation(summary = "根据岗位id修改状态")
    @PostMapping("updateStatusByPostId")
    public Result updateStatusByPostId(@RequestParam Long id, @RequestParam BaseStatus status) {
        // 创建更新条件对象
        LambdaUpdateWrapper<SystemPost> updateWrapper = new LambdaUpdateWrapper<>();
        // 设置更新条件为岗位ID等于传入的ID
        updateWrapper.eq(SystemPost::getId, id);
        // 设置需要更新的字段，即岗位状态
        updateWrapper.set(SystemPost::getStatus, status);
        // 调用服务层方法执行更新操作
        service.update(updateWrapper);
        // 返回操作成功的结果
        return Result.ok();
    }
}
